from tkinter import *
import cv2
from PIL import Image,ImageTk
import mediapipe as mp #媒体管道
import time #时间处理
"""
参考
Tkinter和opencv绘制动态图像
https://blog.csdn.net/MrV2020/article/details/105571829
功能包介绍文档pose
https://google.github.io/mediapipe/solutions/pose.html


"""

def take_snapshot():
    print("有人给你点赞啦！")

def video_loop():
    mpDraw = mp.solutions.drawing_utils #预先声明函数
    mpPose = mp.solutions.pose #点姿势方案
    pose = mpPose.Pose()  #物体姿势

    
    pTime = time.time()

    while True:
        success, img = cap.read()
        # 转化图像
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #转化为RGB，opencv用的是RGB格式的图片
        results = pose.process(imgRGB) #将转化图片赋值
        # print(results.pose_landmarks) #打印实际的地标参数值，xyz
        if results.pose_landmarks:
            mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS) #点画地标 画下划线地标
            # 枚举 id 和 地标
            for id, lm in enumerate(results.pose_landmarks.landmark):
                h, w, c = img.shape
                #print(id, lm) #显示33个点的坐标的信息
                cx, cy = int(lm.x * w), int(lm.y * h) #cx，cy分别为对应的点的像素坐标位置
                cv2.circle(img, (cx, cy), 5, (255, 0, 0), cv2.FILLED) #改变对应圆圈，大小、颜色填充度等

        # 制作帧率显示
        cTime = time.time()
        fps = 1/(cTime-pTime)
        #fps = cTime-pTime
        pTime = cTime
        # 显示帧率，第二个为数值，第三个参数是位置，文字样式，文字大小,颜色，粗度
        cv2.putText(img, str(int(fps)), (70,50),cv2.FONT_HERSHEY_PLAIN, 3,(255,0,0),3)
        
        
        cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)
        current_image = Image.fromarray(cv2image)        # 将图像转换成Image对象
        imgtk = ImageTk.PhotoImage(image=current_image)
        panel.config(image=imgtk)# 图像显示    
        root.after(50,video_loop)## 延时50毫秒，再次调用本函数
        root.mainloop()# gui线程里要尽快执行完工作返回消息机制里，如果把这句写在函数外面，则图像不会显示


        #cv2.imshow("Image", img)
        #cv2.waitKey(1) #每秒100帧，减小他可以设置为10


cap = cv2.VideoCapture(0)    #摄像头
root = Tk()
root.title("opencv + tkinter")

panel = Label(root)  #对Label下定义， 初始化图像管道
panel.pack(padx=10, pady=10)
root.config(cursor="arrow")
btn = Button(root, text="点赞!", command=take_snapshot)
btn.pack(fill="both", expand=True, padx=10, pady=10)

video_loop()

# 当一切都完成后，关闭摄像头并释放所占资源
cap.release()
cv2.destroyAllWindows()
